using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using DataTransferObject;
using Business;

namespace Presentation
{
    public partial class FrmBangCap : Form
    {
        BindingSource bs = new BindingSource();
        clsBangCapDTO BangCapDTO = new clsBangCapDTO();
        clsBangCapBUS BangCapBUS = new clsBangCapBUS();
        DataTable tbl = new DataTable();

        public FrmBangCap()
        {
            InitializeComponent();
        }

        #region Phương thức đưa dữ liệu lên form.

        //Phương thức đưa dữ liệu lên form.
        private void LoadForm()
        {
            HienThiTextBox(false);
            btnluu.Enabled = false;

            bs.DataSource = BangCapBUS.DanhSachBangCap();
            bdnnxb.BindingSource = bs;
            dgvbc.DataSource = bs;
            TaoCotGridView();
        }
        #endregion

        #region Các phương thức tạo mã tự động

        public String DinhdangMACH(String MACH)
        {
            if (MACH.Length == 1)
                MACH = "BC00" + MACH;
            else if (MACH.Length == 2)
                MACH = "BC0" + MACH;
            else if (MACH.Length == 3)
                MACH = "BC" + MACH;
            return MACH;
        }

        private int TimMaCauHoi()
        {
            int sl = 1;
            int dem = 0;
            tbl = BangCapBUS.DanhSachBangCap();
            foreach (DataRow dr in tbl.Rows)
            {
                int ma1 = Convert.ToInt16(Tim_CatChuoi(dr["MABC"].ToString()));
                dem++;
                int ma2 = Convert.ToInt16(Tim_CatChuoi(dr["MABC"].ToString()));

                if (dem != ma2)
                {
                    return dem;
                }
                else
                {
                    sl++;
                }

            }
            return sl;
        }


        public String Tim_CatChuoi(String Chuoicantim)
        {
            int vitri = 0;
            vitri = Chuoicantim.IndexOf(Chuoicantim, 0);
            if (vitri != -1)
                Chuoicantim = Chuoicantim.Remove(0, 2);
            return Chuoicantim;
        }

        #endregion

        #region Các phương thức thêm, sửa, xóa

        //Phương thức sửa bằng cấp.
        private void SuaBangCap()
        {
            BangCapBUSResult rs;
            bool check;

            //Kiểm tra xem có thuộc tính nào bị rỗng ko.
            check = false;
            check = CheckEmpty(BangCapDTO);

            if (check == false) //Nếu có thuộc tính rỗng.
                return;

            rs = BangCapBUS.SuaBangCap(BangCapDTO); //Gọi phượng thức sửa dữ liệu.
            if (rs == BangCapBUSResult.OK) //Nếu sửa thành công.
                MessageBox.Show("Đã cập nhật thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else //Sửa thất bại.
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Không cập nhật được!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            RefreshForm(); //Refresh form.
            btnsua.Text = "Sửa";
        }

        //Phương thức thêm bằng cấp.
        private void ThemBangCap()
        {
            BangCapBUSResult rs;
            bool check;

            //Kiểm tra xem có thuộc tính nào bị rỗng ko.
            check = false;
            check = CheckEmpty(BangCapDTO);

            if (check == false) //Nếu có thuộc tính rỗng.
                return;

            rs = BangCapBUS.ThemBangCap(BangCapDTO); //Thêm dữ liệu vào.
            if (rs == BangCapBUSResult.OK) //Nếu thêm thành công.
                MessageBox.Show("Đã thêm thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else //Thêm thất bại.
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Không thêm được!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            RefreshForm(); //Refresh form.
            btnthem.Text = "Thêm";
        }

        //Phương thức xóa bằng cấp.
        private void XoaBangCap()
        {
            DialogResult dlg = new DialogResult(); //Hỏi trước khi xóa.
            dlg = DevComponents.DotNetBar.MessageBoxEx.Show(this, "Chắc chắn xóa không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
            if (dlg == DialogResult.Yes) //Nếu chọn xóa.
            {
                BangCapBUSResult rs;

                rs = BangCapBUS.XoaBangCap(BangCapDTO); //Gọi phương thức xóa.
                if (rs == BangCapBUSResult.OK) //Nếu xóa thành công.
                    DevComponents.DotNetBar.MessageBoxEx.Show(this, "Xóa thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else //Nếu xóa thất bại.
                    DevComponents.DotNetBar.MessageBoxEx.Show("Không xóa được!\n\n-Có thể có ít nhất 1 nhân viên có bằng cấp này.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                RefreshForm(); //Refresh form.
            }
        }
        #endregion

        #region Các phương thức kiểm tra, refresh data

        //Phương thức kiểm tra dữ liệu rỗng.
        private bool CheckEmpty(clsBangCapDTO obj)
        {
            BangCapBUSResult rs;

            rs = BangCapBUS.KiemTraRong(obj); //Gọi hàm kiểm tra rỗng.
            if (rs == BangCapBUSResult.MABCERROR) //Nếu mã bằng cấp rỗng.
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Mã bằng cấp không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtmabangcap.Focus();
                return false;
            }
            if (rs == BangCapBUSResult.TENBCERROR) //Nếu tên bằng cấp rỗng.
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tên bằng cấp không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttenbangcap.Focus();
                return false;
            }
            return true;
        }

        //Phương thức Refresh lại form.
        private void RefreshForm()
        {
            bs.DataSource = BangCapBUS.DanhSachBangCap();
            bdnnxb.BindingSource = bs;

            HienThiTextBox(false);
            HienThiButton(true);
            btnluu.Enabled = false;
        }
        #endregion

        #region Các phương thức ẩn-hiện Button, Textbox, Tạo cột cho DataGrid.

        //(Ẩn/hiện) Button.
        private void HienThiButton(bool dieukien)
        {
            btnthem.Enabled = dieukien;
            btnsua.Enabled = dieukien;
            btnxoa.Enabled = dieukien;
            btnluu.Enabled = dieukien;
        }

        //(Ẩn/hiện) TextBox.
        private void HienThiTextBox(bool a)
        {
            txtmabangcap.Enabled = a;
            txttenbangcap.Enabled = a;
        }

        //Xóa TextBox.
        private void XoaTextBox()
        {
            txttenbangcap.Text = "";
        }

        //Tạo cột cho GridView
        private void TaoCotGridView()
        {
            dgvbc.Columns["MABC"].HeaderCell.Value = "Mã bằng cấp";
            dgvbc.Columns["TENBC"].HeaderCell.Value = "Tên bằng cấp";
        }
        #endregion

        #region Các phương thức thay đổi nút, chữ trên nút.

        //Khi nhấn nút thêm.
        private void NutThem()
        {
            btnthem.Text = "Hủy Bỏ";
            HienThiButton(false); //Ẩn tất cả các button.
            btnthem.Enabled = true;
            btnluu.Enabled = true;

            HienThiTextBox(true); //Hiển thị các textbox.
            XoaTextBox();
            txtmabangcap.Text = DinhdangMACH(TimMaCauHoi().ToString()); //Tạo mã tự động.
            txtmabangcap.Focus();
        }

        //Khi nhấn nút hủy bỏ thêm.
        private void NutHuyBoThem()
        {
            btnthem.Text = "Thêm";
            HienThiButton(false); //Ẩn tất cả các button.
            btnthem.Enabled = true;
            btnsua.Enabled = true;
            btnxoa.Enabled = true;

            HienThiTextBox(false); //Hiển thị các textbox.
            RefreshForm(); //Refresh form.
        }

        //Khi nhấn nút sửa.
        private void NutSua()
        {
            btnsua.Text = "Hủy Bỏ";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;
            btnluu.Enabled = true;

            HienThiTextBox(true); //Hiển thị các textbox.
            txtmabangcap.Enabled = false;
        }

        //Khi nhấn nút hủy bỏ sửa.
        private void NutHuyBoSua()
        {
            btnsua.Text = "Sửa";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;
            btnthem.Enabled = true;
            btnxoa.Enabled = true;

            HienThiTextBox(false);
        }
        #endregion

        //Events
        #region Các phương thức của các sự kiện trên form.

        private void FrmBangCap_Load(object sender, EventArgs e)
        {
            LoadForm(); //Gọi phương thức đưa dữ liệu lên form.
        }

        private void dgvbc_SelectionChanged(object sender, EventArgs e)
        {
            if (dgvbc.SelectedRows.Count > 0) //Nếu trong DataGrid có từ 1 dòng trở lên.
            {
                txtmabangcap.Text = dgvbc.SelectedRows[0].Cells["MaBC"].Value.ToString(); //Chọn dòng đầu tiên, ô thứ 1.
                txttenbangcap.Text = dgvbc.SelectedRows[0].Cells["TenBC"].Value.ToString(); //Chọn dòng đầu tiên, ô thứ 2.
            }
        }

        private void btnthoat_Click(object sender, EventArgs e)
        {
            DialogResult dlg = new DialogResult();
            dlg = DevComponents.DotNetBar.MessageBoxEx.Show("Có muốn thoát không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dlg == DialogResult.Yes)
            {
                this.Close();
            }
        }

        private void btnthem_Click(object sender, EventArgs e)
        {
            if (btnthem.Text == "Thêm")
            {
                NutThem(); //Khi nhấn nút thêm.
            }
            else
            {
                NutHuyBoThem(); //Khi nhấn nút hủy bỏ thêm.
            }
        }

        private void btnsua_Click(object sender, EventArgs e)
        {
            if (btnsua.Text == "Sửa")
            {
                NutSua(); //Khi nhấn nút sửa.
            }
            else
            {
                NutHuyBoSua(); //Khi nhấn nút hủy bỏ sửa.
            }
        }

        private void btnluu_Click(object sender, EventArgs e)
        {
            if (btnthem.Enabled == true) //Lưu của nút thêm.
            {
                BangCapDTO = new clsBangCapDTO(); //Khởi tạo đối tượng.
                //--------------------------------
                //Lấy dữ liệu.
                BangCapDTO.MaBC = txtmabangcap.Text;
                BangCapDTO.TenBC = txttenbangcap.Text;
                //---------------------------------

                ThemBangCap(); //Gọi phương thức thêm thể loại.
            }
            else //Lưu của nút sửa.
            {
                BangCapDTO = new clsBangCapDTO(); //Khởi tạo đối tượng.
                //--------------------------------
                //Lấy dữ liệu.
                BangCapDTO.MaBC = txtmabangcap.Text;
                BangCapDTO.TenBC = txttenbangcap.Text;
                //--------------------------------

                SuaBangCap(); //Gọi phương thức sửa thể loại.
            }
        }

        private void btnxoa_Click(object sender, EventArgs e)
        {
            BangCapDTO = new clsBangCapDTO(); //Khởi tạo đối tượng.
            //--------------------------------
            BangCapDTO.MaBC = txtmabangcap.Text.Trim(); //Lấy dữ liệu.
            //--------------------------------

            XoaBangCap(); //Gọi phương thức xóa thể loại.
        }
        #endregion
    }
}